package controlador;

import java.awt.Panel;
import java.util.ArrayList;
import java.util.Iterator;
import modelo.Nivel.Nivel;
import modelo.controlAereo.Aeronave;
import vista.Aeronave.ImagenAeronave;
import vista.IndustriaDeVistas;
import vista.Nivel.VistaAvionesAterrizados;
import vista.Menu.VistaMenu;
import titiritero.ControladorJuego;
import titiritero.ObjetoVivo;
import titiritero.SuperficieDeDibujo;
import titiritero.vista.ImagenRectangular;
import titiritero.vista.MouseClickController;
import titiritero.vista.MouseDragController;

public class VistaJuego implements ObjetoVivo{

	private ControladorJuego controladorJuego = null;
	private Nivel unNivel;
	private ControladorDeNiveles controladorNiveles;
	private IndustriaDeVistas industriaDeVistas;
	private VistaAvionesAterrizados vistaAvionesAterrizados;
	private ImagenRectangular vistaEscenario;
	private ControladorDeAeronaves controladorDeAeronaves;
	private ControladorMenu controladorMenu;
	private VistaMenu unMenu;

	
	public VistaJuego(SuperficieDeDibujo superficieDeDibujo){
		//Creo el Controlador del juego y le seteo la superficie donde se mostraran los dibujables
		controladorJuego = new ControladorJuego(true);
		controladorJuego.setSuperficieDeDibujo(superficieDeDibujo);
		controladorDeAeronaves = new ControladorDeAeronaves();
		controladorJuego.agregarMouseClickObservador(controladorDeAeronaves);
		controladorJuego.agregarMouseDragReleaseObservador(controladorDeAeronaves);
                
		controladorMenu = new ControladorMenu(this);

		//Creo el nivel
		controladorNiveles = new ControladorDeNiveles();
		industriaDeVistas = new IndustriaDeVistas();
		
		controladorJuego.setIntervaloSimulacion(15);
		
		unMenu = controladorMenu.getMenu();
		controladorJuego.agregarDibujable(unMenu);
		controladorJuego.agregarMouseClickObservador(unMenu);
	}
	
	public void comenzar(){
		controladorJuego.comenzarJuegoAsyn();	
	}
	
	public void detener() {
		controladorJuego.detenerJuego();
	}
	
	
	public void pausar() {
		controladorJuego.detenerJuego();
		
	}

	public void continuarJuego() {
		controladorJuego.comenzarJuego();
		
	}

	
	public void agregarControladorDelMouse(Panel unPanel){
		unPanel.addMouseListener(new MouseClickController(this.controladorJuego));
		unPanel.addMouseMotionListener(new MouseDragController(this.controladorJuego));
	}
	

	
	private void agregarDibujables(ControladorJuego unControlador, ArrayList<Aeronave> obstaculos){
		Iterator<Aeronave> iteradorObstaculo= obstaculos.iterator();
		while(iteradorObstaculo.hasNext()){
			Aeronave unaAeronave =iteradorObstaculo.next();
			ImagenAeronave vistaAeronave = industriaDeVistas.crearUnaVista(unaAeronave);
			vistaAeronave.setAeronave(unaAeronave);
			vistaAeronave.setControladorImagen(controladorDeAeronaves);
			unControlador.agregarDibujable(vistaAeronave);
			controladorJuego.agregarMouseClickObservador(vistaAeronave);
			controladorJuego.agregarMouseDragReleaseObservador(vistaAeronave);
		}
	}
	
	private void actualizarVistaNivel(){
		
		//Actualizar contador de aviones aterrizados	
		vistaAvionesAterrizados.setAvionesAterrizados(unNivel.devolverCantidadDeAvionesAterrizados());	
			
		//Remover vista de aviones aterrizados
		this.eliminarAvionesAterrizados(controladorJuego);// TODO Auto-generated method stub
		
		//Agregar vistas de nuevos aviones
		this.agregarDibujables(controladorJuego,this.unNivel.obtenerAeronavesNuevas());
		this.unNivel.eliminarAeronavesNuevas();	
	}

	private void eliminarAvionesAterrizados(ControladorJuego controladorJuego2) {
            controladorJuego2.eliminarAeronavesAterrizadas(unNivel.devolverAeronavesAterrizadas());
            unNivel.eliminarAeronavesAterrizadas();
	}
	
	public void nuevoNivel(){
				//Creo el nivel
				unNivel = controladorNiveles.devolverNivel();
	
				//Creo la vista del nivel
				controladorJuego.eliminarDibujables();
				controladorJuego.eliminarObjetosVivos();
				vistaEscenario = industriaDeVistas.crearUnaVista(unNivel);
				vistaAvionesAterrizados = new VistaAvionesAterrizados(400, 11);

				//Agrego la visual del nivel
				controladorJuego.removerMenu();
				controladorJuego.agregarDibujable(vistaEscenario);
				controladorJuego.agregarDibujable(vistaAvionesAterrizados);	
				

				//Agrego como objetoVivo a esta Instancia
				controladorJuego.agregarObjetoVivo(this);
				controladorJuego.agregarObjetoVivo(unNivel);
			}

	@Override
	public void vivir() {
            if(!controladorMenu.hayMenuAbierto())
            {
                this.actualizarVistaNivel();
				if(unNivel.perdiste() || unNivel.ganaste() )
				{
                    unMenu = controladorMenu.getMenu();
                    controladorJuego.agregarDibujable(unMenu);
                    controladorJuego.agregarMouseClickObservador(unMenu);
                }		
            }
	}

	public Nivel getNivel(){
		return this.unNivel;
	}
	
	
}
